究竟什么是软件测试架构?
【 看到ThoughtWorks刘冉的文章《从测试策略到测试架构》,觉得“测试策略”和“测试架构”是软件测试众多概念中比较难以理解的,有必要多谈谈。上周已讨论了:
今天讨论一下究竟什么是软件测试架构?有哪些内容?给我们带来什么好处?】
皇帝:你丐帮弟子几千万,你一天不解散,叫朕怎么安心?
苏乞儿:丐帮有多少弟子不是由我来决定的,而是由你决定的。
皇帝:我?
苏乞儿:如果你真的英明神武,使得国泰民安,鬼才愿意当乞丐呐!
言外之意就是说:如果皇帝干得好,人民没有什么疾苦,乞丐自然就少了,丐帮自然就小了。 皇帝要阻止丐帮的壮大,靠的不是官府差役,也不是加重刑罚,而是靠治国,把天下治理得井井有条,民富国强,丐帮自然就被消弱了!
这也好比软件开发和测试的关系,皇帝代表开发的一方,苏乞儿的丐帮就代表众多的Bug。如果开发人员把事情做好了,哪有那么多缺陷? 如果开发架构师真能把系统设计得很完美,哪需要测试架构师呢?
究竟什么是软件测试架构呢?2012年我写的书《完美测试:软件测试系列最佳实践》用了整整一章讨论这个问题,今天由于时间关系,就简明扼要讨论一下这个问题:
软件测试架构的定义与内容
测试架构的带来的收益
1. 软件测试架构的定义与内容
要了解什么是“软件测试架构”,可以先看看什么是软件架构。比较早而权威的解释是: Softwarearchitecture is“designing and specifyingthe overall system structure [Garlan andShaw,1993]”。
软件系统的架构是一个比喻,类似于建筑物的架构。
软件架构是指软件系统的基本结构、一个系统的草图,作为一个软件系统的高层此的抽象,描述直接构成系统的各个抽象(或逻辑的)组件、组件的性质和责任,以及各个组件之间的关系,如有哪些组件、某个组件起什么作用、组件之间的接口定义、模块之间是如何通讯或交互的等。软件架构是系统顶层设计的结果,包括软件设计中可能存在的特定结构的选择。
根据软件架构,我们也很容易得到测试架构的定义:测试架构是对软件测试解决方案的抽象性概括,通过逻辑结构(草图、模型等)来描述测试的解决方案,包括高层次或低层次的解决方案、整体或单个测试问题的解决方案。测试架构也可以理解为是针对被测试系统(SUT)如何进行测试(包括手工测试、自动化测试)的总体架构,包括如何定义/描述测试单元(如测试输入、测试操控、结果观察、测试输出等)之间的关系、测试单元和SUT之间的关系。这样说,还比较抽象,我们可以进一步探讨一下测试架构包含哪些内容,并给出不同的示例来给您直观的感受。
通过图形或其它符号方式系统地描述软件测试操作或管理的原理。如我在《全程软件测试》上就有一张图将测试思想、测试目标、测试方法、测试用例、测试过程、测试阶段、测试缺陷等测试元素的关系清晰地描述出来。之前,我还画过一张测试全景图 这才是世上最全的“软件测试”思维导图!,也是帮助大家系统地认识测试,有助于更好地做好测试。
通过逻辑符号来描述测试输入、测试过程和输出的测试结构。
整体的测试目标如何分解为更小的、更具体的测试子目标,可以从质量属性去分解,也可以从技术实现特征去分解。
如何从测试角度来分解测试对象、如何构建测试模型?如分层测试、有限状态机等。
每一个测试对象的(功能/非功能性)测试,在技术上如何完成测试设计与执行,包括如何验证系统的性能、如何进行系统的可靠性测试或选择什么测试方法进行某项功能测试更有效,如下面非功能性测试架构图:
测试过程或测试流程的逻辑结构,通过模型来展示测试过程或流程,如W模型、TMap模型等。
我2010年绘制的敏捷测试流程架构
(创新的)测试模式,包括测试分析模式、测试设计模式、测试执行模式等。
从技术上帮助开发在系统构建出良好的可测试性(testability),甚至和开发一起完成“测试驱动设计(Design for test)”
图 Built in Self Test Architecture
自动化测试(TA)架构,单元测试TA框架、功能测试TA框架、性能测试框架、安全性测试框架等。
测试环境的逻辑结构、测试数据生产的逻辑过程/机制等,包括整个组织的TA平台、云测试服务平台、测试数据备份/恢复平台等。
JUnit单元测试架构
性能测试工具架构
分布式性能测试部署架构
2. 测试架构带来的收益
测试架构无处不在,不仅能解决技术问题,也可以解决流程、管理上的问题,除此之外,还带来其它很多收益,例如:
更早、更快地在自动化测试、测试设计等其它技术方案更快地做出决策;
基于测试架构,可以更有效、更容易与利益相关者的沟通,可以更好地满足测试需求
在测试执行前,为测试的具体分析和详细设计(测试用例设计)提供了基础,从理论上验证测试方案的可行性,包括可能达到的测试覆盖率;
为整个测试的构成元素和将来测试决策的复用提供了基础
有助于降低测试风险、降低测试出错的机会,降低测试成本。